﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using TiEntityObject.Transport;
using System.IO;
using MergeTI.TiDocumentProcessor;
using Lucene.Net.Search;
using Lucene.Net.Documents;
using System.Collections;
using TI_Index;
using MergeTI.TiEntityObjects.Clifar;
using Helper;
using Helper.FullTextIndex;


namespace TI
{
    /// <summary>
    /// Конвеер просматривает папку заданного дня -на основании названия файла формирует коллекцию файлов для обработки.
    /// Первый этап файлы помещаются в индекс
    /// Второй этап для каждого файла формируется набор ключевых слов
    /// Тэги пишутся в БД.
    /// Первичный набор файлов переименовывается
    /// </summary>
    public class AttachController
    {
        /// <summary>
        /// Список расширений относящихся к офисным файлам
        /// </summary>
        public static string[] OfiiceExt = { ".doc",".docx",".pdf",".ppt",".rtf",".xls",".xlsx",".xlsx", ".rtf" };
        
        ConveyorItems conveyorItems = null;

        const string idxPref = "IDX";

        string dayFolder = string.Empty;
        
        string dayInexFolder = string.Empty;
        
        DateTime Day=DateTime.Now;
      
        /// <summary>
        /// Обработать скаченые документы в рамках дня 
        /// </summary>
        public void RUN(DateTime day)
        {
            //выставить рабочий день    
            this.Day = day;

            dayFolder = TransportConfig.Instance.GetAttachStoreFolderPath(Day);
            dayInexFolder = dayFolder +@"\"+ idxPref;

            //распаковать архивы
            UnpackZipAttach();

            //Обновление индекса
            conveyorItems = new ConveyorItems(dayFolder,dayInexFolder);
            conveyorItems.MergeIndex();
            
            //Формируем теги привязанные к файлам 
            PopulateTags();
            
            //Тэги в БД           
            UpdateDocumentMeta();

        }

        /// <summary>
        /// пройтись по всей директории распаковать и переименовать все что есть/
        /// новоявленные файлы прописать в DocumentMeta
        /// </summary>
        private void UnpackZipAttach()
        {
            AttachDocTools dt = new AttachDocTools();
            dt.onAfterUnZipDoc += new AttachDocTools.UnzipDoc(dt_onAfterUnzipDoc);
            dt.onAfterUnZipDocComplete += new AttachDocTools.UnZipDocComplete(dt_onAfterUnZipDocComplete);
            dt.UnzipFolder(TransportConfig.Instance.TempDecompressFolder, TransportConfig.Instance.GetAttachStoreFolderPath(this.Day));
            
            string[] lst = Directory.GetDirectories(TransportConfig.Instance.TempDecompressFolder);
            foreach (string i in lst)
            {
                try
                {
                    Directory.Delete(i,true);
                }
                catch {
                    continue; 
                }
            }
        }

        /// <summary>
        /// Воткнуть в DocumentMeta описание файла
        /// </summary>
        /// <param name="fileName"></param>
        /// <param name="filePref"></param>
        private static void dt_onAfterUnzipDoc(string fileName, string filePref, int numberInZip, string fileExt)
        {
            string sql = "generateDocumentMeta('{0}','{1}',{2},'{3}')";
            MongoTools t = new MongoTools();
            t.ExecuteScript(string.Format(sql, filePref, fileName, numberInZip, fileExt));
        }

        private static void dt_onAfterUnZipDocComplete(string zipFileName)
        {
            TiDocInfo di = new TiDocInfo(zipFileName);
            string sql = "deleteDocumentMeta('{0}',{1})";
            MongoTools t = new MongoTools();
            t.ExecuteScript(string.Format(sql, di.DocID, di.Part));
        }


        /// <summary>
        /// Формируем тэги 
        /// </summary>
        private void PopulateTags() {
            List<string> words = getKeyWords();
            Helper.FullTextIndex.HDSearchEngine ENG = new Helper.FullTextIndex.HDSearchEngine(this.dayInexFolder);

            int j = 0;
            foreach (string w in words) {
                //получаем резальтат дл тэга(слова)
                List<SearchResult> w_result= ENG.Search(w);
             
                //соотносим файл - тэги
                conveyorItems.LinkTag(w, w_result);
                ++j;
                Console.WriteLine(j.ToString()+" " + w + " " + w_result.Count.ToString()); 
            }
        }

        /// <summary>
        /// Проставляет соответсвующим DocumentMeta свойство TagInfo
        /// </summary>
        private void UpdateDocumentMeta()
        {
            foreach (ConveyorItem i in this.conveyorItems)
            {
                i.UpdateDocumentMeta();
            }
        }

        /// <summary>
        /// Вернуть список ключевых слов
        /// </summary>
        /// <returns></returns>
        private List<string> getKeyWords() {
            return TransportConfig.Instance.KeyWords; 

             //Амоксицил  Клавул Амоксиклав
            //List<string> result = new List<string>();
            //result.Add("Амоксицил");
            //result.Add("Клавул");
            //result.Add("Амоксиклав");

            //string script = "db.INN.find().toArray();";
            //List<Inn> source = Helper.MongoTools.Instance.GetCollection<Inn>(script);
            //List<string> result = new List<string>();
            //string[] r = null;
            //foreach (Inn i in source)
            //{
            //    r=i.InnR.Split(" ".ToCharArray()[0]); 
            //    if(r.Length==1) 
            //            result.Add(i.InnR);
            //}
            //return result;
        } 

        #region
        
        public static Boolean IsOfficeFile(string fileName)
        {
            FileInfo fi = new FileInfo(fileName);
            foreach (string i in OfiiceExt)
            {
                if (i.ToUpper().Equals(fi.Extension.ToUpper()))
                    return true;
            }
            return false;
        }

        #endregion
    }

}
